package com.lxx.jmb2c.handlers;

/**
 * 线程上下文处理器
 * 
 * 这个类使用ThreadLocal来存储当前线程的用户ID，可以在整个请求处理链路中共享用户信息
 * 
 * 主要用途：
 * 1. 在拦截器中设置用户ID
 * 2. 在服务层获取用户ID
 * 3. 在日志中记录用户信息
 * 
 * ThreadLocal原理：
 * - 每个线程有独立的变量副本
 * - 线程安全，无需同步
 * - 生命周期与线程绑定
 * 
 * 内存泄漏风险：
 * 1. 线程池中的线程会重用
 * 2. 如果不调用remove()，之前的用户ID会残留
 * 3. 可能导致内存泄漏
 * 
 * 最佳实践：
 * 1. 在拦截器中设置用户ID
 * 2. 在过滤器或拦截器中调用remove()
 * 3. 避免存储大对象
 * 
 * 使用示例：
 * // 设置用户ID
 * BaseContextHandler.set(123L);
 * 
 * // 获取用户ID
 * Long userId = BaseContextHandler.get();
 * 
 * // 清除用户ID
 * BaseContextHandler.remove();
 * 
 * @author wuyunbin
 * @since 2025-07-02
 */
public class BaseContextHandler {
    /**
     * 使用ThreadLocal存储用户ID
     * 注意：必须使用remove()方法清除，避免内存泄漏
     */
    private static final ThreadLocal<Long> context = new ThreadLocal<>();

    /**
     * 设置当前线程的用户ID
     * @param userId 用户ID
     */
    public static void set(Long userId) {
        context.set(userId);
    }

    /**
     * 获取当前线程的用户ID
     * @return 用户ID，可能为null
     */
    public static Long get() {
        return context.get();
    }

    /**
     * 清除当前线程的用户ID
     * 重要：必须在请求处理完成后调用，特别是在线程池环境中
     */
    public static void remove() {
        context.remove();
    }
}
